/**每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值
 * x恰好减到0，返回最小操作数；否则返回-1
 * @param {number[]} nums
 * @param {number} x
 * @return {number}
 * 等价于求 和为sum(nums)-x的最长连续子数组
 * 双指针 类似209
 */
var minOperations = function (nums, x) {
    let target = eval(nums.join('+')) - x
    if (target < 0) {
        // 小于0说明找不到这样的最长连续子数组
        return -1
    }
    // ans为子数组长度
    // left为左指针，s为子数组的和
    let ans = -1, left = 0, s = 0
    for (let i = 0; i < nums.length; i++) {
        // s先加上当前位的元素
        s += nums[i]
        // s如果大于target就从 最左边left 开始扣除，直到小于等于target
        while (s > target) {
            s -= nums[left]
            left++
        }
        // 如果等于target就加入答案，最终剩余长度是i - left + 1
        if (s == target) {
            ans = Math.max(ans, i - left + 1)
        }
    }
    if (ans < 0) {
        return -1
    } else {
        // 总长减去子数组长度即为最小操作数
        return nums.length - ans
    }
};